package cn.springcloud.fix.samples.mq.consumer;

import cn.hutool.extra.mail.Mail;
import cn.springcloud.fix.samples.config.Constant;
import cn.springcloud.fix.samples.config.RabbitConfig;
import cn.springcloud.fix.samples.mq.MessageHelper;
import com.rabbitmq.client.Channel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageProperties;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.io.IOException;

@Slf4j
@Component
public class SimpleMailConsumer implements BaseConsumer {

    /**
     * 成功确认
     * void basicAck(long deliveryTag, boolean multiple) throws IOException;
     * deliveryTag:该消息的index
     * multiple：是否批量. true：将一次性ack所有小于deliveryTag的消息。
     * 消费者成功处理后，调用channel.basicAck(message.getMessageProperties().getDeliveryTag(), false)方法对消息进行确认。
     * <p>
     * 失败确认
     * void basicNack(long deliveryTag, boolean multiple, boolean requeue)
     * deliveryTag:该消息的index。
     * multiple：是否批量. true：将一次性拒绝所有小于deliveryTag的消息。
     * requeue：被拒绝的是否重新入队列。
     * <p>
     * void basicReject(long deliveryTag, boolean requeue) throws IOException;
     * deliveryTag:该消息的index。
     * requeue：被拒绝的是否重新入队列。
     * <p>
     * channel.basicNack 与 channel.basicReject 的区别在于basicNack可以批量拒绝多条消息，而basicReject一次只能拒绝一条消息。
     */
    @Override
    @RabbitListener(queues = RabbitConfig.MAIL_QUEUE_NAME)
    public void consume(Message message, Channel channel) {
        Mail mail = MessageHelper.msgToObj(message, Mail.class);
        log.info("收到消息: {}", mail.toString());

        // String msgId = mail.getMsgId();
        // MsgLog msgLog = msgLogService.selectByMsgId(msgId);
        // if (null == msgLog || msgLog.getStatus().equals(Constant.MessageStatus.CONSUMED_SUCCESS)) {// 消费幂等性
        //     log.info("重复消费, msgId: {}", msgId);
        //     return;
        // }

        try {
            MessageProperties properties = message.getMessageProperties();
            long tag = properties.getDeliveryTag();
            channel.basicAck(tag, false);// 消费确认
        } catch (IOException e) {

        }

        // boolean success = mailUtil.send(mail);
        // if (success) {
        //     msgLogService.updateStatus(msgId, Constant.MsgLogStatus.CONSUMED_SUCCESS);
        //     channel.basicAck(tag, false);// 消费确认
        // } else {
        //     channel.basicNack(tag, false, true);
        // }
    }
}
